
import csv
import matplotlib.pyplot as plt

# 设置中文字体，确保中文正常显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题


def read_csv_data(file_path, category_col, value_col):
    """
    从 CSV 文件读取数据

    参数:
    file_path (str): CSV 文件路径
    category_col (int): 分类列的索引（从0开始）
    value_col (int): 数值列的索引（从0开始）

    返回:
    tuple: 包含分类列表和对应数值列表的元组
    """
    categories = []
    values = []

    with open(file_path, 'r', encoding='gb18030') as file:
        reader = csv.reader(file)
        next(reader)  # 跳过表头

        for row in reader:
            if len(row) > max(category_col, value_col):
                categories.append(row[category_col])
                values.append(float(row[value_col]))

    return categories, values


def generate_pie_chart(categories, values, title, output_path=None):
    """
    生成扇形图

    参数:
    categories (list): 分类列表
    values (list): 对应数值列表
    title (str): 图表标题
    output_path (str, optional): 保存图片的路径，若为None则显示图表
    """
    # 创建画布
    plt.figure(figsize=(10, 8))

    # 计算百分比总和，确保总和为100%
    total = sum(values)
    percentages = [v / total * 100 for v in values]

    # 找出最大占比的项，用于突出显示
    explode = [0.1 if p == max(percentages) else 0 for p in percentages]

    # 自定义颜色
    colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0', '#ffb3e6']

    # 绘制扇形图
    plt.pie(
        values,
        explode=explode,
        labels=categories,
        colors=colors[:len(categories)],
        autopct='%1.1f%%',  # 显示百分比，保留一位小数
        shadow=True,  # 添加阴影
        startangle=90  # 起始角度
    )

    # 设置为正圆形
    plt.axis('equal')

    # 添加标题
    plt.title(title, fontsize=16)

    # 添加图例
    plt.legend(categories, loc="best")

    # 如果指定了输出路径，则保存图片；否则显示图片
    if output_path:
        plt.savefig(output_path, dpi=300, bbox_inches='tight')
        print(f"图表已保存至: {output_path}")
    else:
        plt.show()


def main():
    # CSV 文件路径（请替换为实际文件路径）
    csv_file = 'C:/Users/IT14/Desktop/sales_data.csv'

    # 配置参数
    category_column = 0  # 分类列索引（假设第一列是分类）
    value_column = 1  # 数值列索引（假设第二列是数值）
    chart_title = '销售数据分布扇形图'

    # 读取数据
    categories, values = read_csv_data(csv_file, category_column, value_column)

    if not categories or not values:
        print("没有足够的数据来生成图表")
        return

    # 生成并显示/保存图表
    generate_pie_chart(categories, values, chart_title, output_path='sales_pie_chart.png')


if __name__ == "__main__":
    main()